/**
 * 设备分享管理API
 * 用于前端调用沙画设备分享相关功能
 */

// 导入云对象
const sandartObj = uniCloud.importObject('sandart')

/**
 * 设备分享API模块
 */
export default {
	/**
	 * 创建设备分享
	 * @param {object} params 分享参数
	 * @param {string} params.deviceId 设备ID
	 * @param {string} params.sharedUserEmail 被分享用户邮箱
	 * @param {Array} [params.permissions] 权限列表
	 * @param {number} [params.expireDays] 过期天数
	 * @param {object} [params.title] 分享标题（多语言）
	 * @param {object} [params.shareMessage] 分享消息（多语言）
	 * @param {object} [params.shareNote] 分享备注（多语言）
	 * @returns {Promise<object>} 分享结果
	 * @description 创建分享后会自动向被分享用户发送邀请消息
	 * @example
	 * const result = await shareApi.createShare({
	 *   deviceId: 'device123',
	 *   sharedUserEmail: 'user@example.com',
	 *   permissions: ['view', 'control'],
	 *   expireDays: 30,
	 *   title: {
	 *     'zh-Hans': '我的沙画设备',
	 *     'en': 'My Sand Art Device'
	 *   },
	 *   shareMessage: {
	 *     'zh-Hans': '邀请您使用我的设备',
	 *     'en': 'Invite you to use my device'
	 *   }
	 * })
	 */
	async createShare(params) {
		try {
			const result = await sandartObj.createDeviceShare(params)
			return result
		} catch (error) {
			console.error('创建设备分享失败:', error)
			throw error
		}
	},

	/**
	 * 接受分享邀请
	 * @param {object} params 接受参数
	 * @param {string} params.shareId 分享ID
	 * @param {string} params.inviteCode 邀请码
	 * @returns {Promise<object>} 接受结果
	 * @example
	 * const result = await shareApi.acceptShare({
	 *   shareId: 'share123',
	 *   inviteCode: 'abc12345'
	 * })
	 */
	async acceptShare(params) {
		try {
			const result = await sandartObj.acceptDeviceShare(params)
			return result
		} catch (error) {
			console.error('接受分享邀请失败:', error)
			throw error
		}
	},

	/**
	 * 拒绝分享邀请
	 * @param {object} params 拒绝参数
	 * @param {string} params.shareId 分享ID
	 * @param {string} [params.rejectReason] 拒绝原因
	 * @returns {Promise<object>} 拒绝结果
	 * @example
	 * const result = await shareApi.rejectShare({
	 *   shareId: 'share123',
	 *   rejectReason: '暂时不需要'
	 * })
	 */
	async rejectShare(params) {
		try {
			const result = await sandartObj.rejectDeviceShare(params)
			return result
		} catch (error) {
			console.error('拒绝分享邀请失败:', error)
			throw error
		}
	},

	/**
	 * 撤销设备分享
	 * @param {object} params 撤销参数
	 * @param {string} params.deviceId 设备ID
	 * @param {string} params.sharedUserId 被分享用户ID
	 * @param {string} [params.revokeReason] 撤销原因
	 * @returns {Promise<object>} 撤销结果
	 * @example
	 * const result = await shareApi.revokeShare({
	 *   deviceId: 'device123',
	 *   sharedUserId: 'user456',
	 *   revokeReason: '设备不再共享'
	 * })
	 */
	async revokeShare(params) {
		try {
			const result = await sandartObj.revokeDeviceShare(params)
			return result
		} catch (error) {
			console.error('撤销设备分享失败:', error)
			throw error
		}
	},

	/**
	 * 获取设备分享列表
	 * @param {object} params 查询参数
	 * @param {string} params.deviceId 设备ID
	 * @param {number} [params.status] 状态筛选
	 * @returns {Promise<object>} 分享列表
	 * @example
	 * const result = await shareApi.getDeviceShareList({
	 *   deviceId: 'device123',
	 *   status: 1 // 只获取已接受的分享
	 * })
	 * console.log(result.shares) // 分享列表
	 */
	async getDeviceShareList(params) {
		try {
			const result = await sandartObj.getDeviceShareList(params)
			return result
		} catch (error) {
			console.error('获取设备分享列表失败:', error)
			throw error
		}
	},

	/**
	 * 获取用户收到的分享邀请
	 * @param {object} params 查询参数
	 * @param {number} [params.status] 状态筛选
	 * @param {number} [params.page] 页码
	 * @param {number} [params.limit] 每页数量
	 * @returns {Promise<object>} 邀请列表
	 * @example
	 * const result = await shareApi.getUserInvites({
	 *   status: 0, // 只获取待处理的邀请
	 *   page: 1,
	 *   limit: 20
	 * })
	 * console.log(result.invites) // 邀请列表
	 */
	async getUserInvites(params = {}) {
		try {
			const result = await sandartObj.getUserShareInvites(params)
			return result
		} catch (error) {
			console.error('获取分享邀请失败:', error)
			throw error
		}
	},

	/**
	 * 获取用户可访问的共享设备列表
	 * @param {object} params 查询参数
	 * @param {number} [params.page] 页码
	 * @param {number} [params.limit] 每页数量
	 * @returns {Promise<object>} 共享设备列表
	 * @example
	 * const result = await shareApi.getSharedDevices({
	 *   page: 1,
	 *   limit: 20
	 * })
	 * console.log(result.devices) // 共享设备列表
	 */
	async getSharedDevices(params = {}) {
		try {
			const result = await sandartObj.getSharedDevices(params)
			return result
		} catch (error) {
			console.error('获取共享设备列表失败:', error)
			throw error
		}
	},

	/**
	 * 更新分享权限
	 * @param {object} params 更新参数
	 * @param {string} params.shareId 分享ID
	 * @param {Array} params.permissions 新的权限列表
	 * @returns {Promise<object>} 更新结果
	 * @example
	 * const result = await shareApi.updatePermissions({
	 *   shareId: 'share123',
	 *   permissions: ['view'] // 只保留查看权限
	 * })
	 */
	async updatePermissions(params) {
		try {
			const result = await sandartObj.updateSharePermissions(params)
			return result
		} catch (error) {
			console.error('更新分享权限失败:', error)
			throw error
		}
	},

	/**
	 * 分享快捷操作
	 */
	shortcuts: {
		/**
		 * 获取待处理的分享邀请
		 * @returns {Promise<object>} 待处理邀请列表
		 */
		async getPendingInvites() {
			return await this.getUserInvites({ status: 0 })
		},

		/**
		 * 获取已接受的分享邀请
		 * @returns {Promise<object>} 已接受邀请列表
		 */
		async getAcceptedInvites() {
			return await this.getUserInvites({ status: 1 })
		},

		/**
		 * 获取已拒绝的分享邀请
		 * @returns {Promise<object>} 已拒绝邀请列表
		 */
		async getRejectedInvites() {
			return await this.getUserInvites({ status: 2 })
		},

		/**
		 * 获取设备的有效分享列表
		 * @param {string} deviceId 设备ID
		 * @returns {Promise<object>} 有效分享列表
		 */
		async getActiveShares(deviceId) {
			return await this.getDeviceShareList({ deviceId, status: 1 })
		},

		/**
		 * 快速分享设备（使用默认设置）
		 * @param {string} deviceId 设备ID
		 * @param {string} sharedUserEmail 被分享用户邮箱
		 * @returns {Promise<object>} 分享结果
		 */
		async quickShare(deviceId, sharedUserEmail) {
			return await this.createShare({
				deviceId,
				sharedUserEmail,
				permissions: ['view', 'control'],
				expireDays: 30
			})
		},

		/**
		 * 批量撤销设备的所有分享
		 * @param {string} deviceId 设备ID
		 * @returns {Promise<Array>} 撤销结果列表
		 */
		async revokeAllShares(deviceId) {
			try {
				// 先获取设备的所有有效分享
				const shareList = await this.getDeviceShareList({ deviceId, status: 1 })
				
				// 批量撤销
				const revokePromises = shareList.shares.map(share => 
					this.revokeShare({
						deviceId,
						sharedUserId: share.shared_user_id,
						revokeReason: '批量撤销'
					})
				)
				
				const results = await Promise.allSettled(revokePromises)
				
				return {
					success: true,
					total: shareList.shares.length,
					succeeded: results.filter(r => r.status === 'fulfilled').length,
					failed: results.filter(r => r.status === 'rejected').length,
					results
				}
			} catch (error) {
				console.error('批量撤销分享失败:', error)
				throw error
			}
		}
	},

	/**
	 * 分享状态常量
	 */
	STATUS: {
		PENDING: 0,    // 待接受
		ACCEPTED: 1,   // 已接受
		REJECTED: 2,   // 已拒绝
		REVOKED: 3,    // 已撤销
		EXPIRED: 4     // 已过期
	},

	/**
	 * 权限常量
	 */
	PERMISSIONS: {
		VIEW: 'view',        // 查看权限
		CONTROL: 'control',  // 控制权限
		EDIT: 'edit',       // 编辑权限
		ADMIN: 'admin'      // 管理权限
	},

	/**
	 * 分享相关消息类型
	 * @description 分享操作会自动发送相应的系统消息，消息类型如下：
	 * 
	 * 1. share_invite - 分享邀请消息
	 *    - 触发时机：创建分享时自动发送给被分享用户
	 *    - 消息数据：{ type: 'share_invite', device_id, device_name, share_id, invite_code, owner_id }
	 * 
	 * 2. share_notification - 分享状态通知消息
	 *    - share_accepted：分享被接受时发送给设备拥有者
	 *    - share_rejected：分享被拒绝时发送给设备拥有者  
	 *    - share_revoked：分享被撤销时发送给被分享用户
	 *    - 消息数据：{ type: 'share_accepted|share_rejected|share_revoked', device_id, device_name, ... }
	 * 
	 * 消息支持多语言，包含中文、英文、日文、韩文、西班牙文、法文
	 */
	MESSAGE_TYPES: {
		SHARE_INVITE: 'share_invite',           // 分享邀请
		SHARE_NOTIFICATION: 'share_notification' // 分享状态通知
	}
}
